﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Academy.Numerics
{
    /// <summary>
    /// Defines methods that a value type or class implements to support arithmetic operations with other instances.
    /// </summary>
    public interface IArithmeticallyOperable
    {
        /// <summary>
        /// Gets the result of adding the current object and another object.
        /// </summary>
        /// <param name="obj">The object to add to the current object.</param>
        /// <returns>The result of adding the current object and the specified argument.</returns>
        object Add(object obj);
        /// <summary>
        /// Gets the result of substract the current object and another object.
        /// </summary>
        /// <param name="obj">The object to substract to the current object.</param>
        /// <returns>The result of substract the specified argument to the current object.</returns>
        object Subtract(object obj);
        /// <summary>
        /// Gets the result of multiply the current object by another object.
        /// </summary>
        /// <param name="obj">The object to multiply the current object by.</param>
        /// <returns>The result of multiply the current object by the specified argument.</returns>
        object Multiply(object obj);
        /// <summary>
        /// Gets the result of divide the current object by another object.
        /// </summary>
        /// <param name="obj">The object to divide the current object by.</param>
        /// <returns>The result of divide the current object by the specified argument.</returns>
        object Divide(object obj);
        /// <summary>
        /// Gets the remainder value of divide the current object by another object.
        /// </summary>
        /// <param name="obj">The object to divide the current object by.</param>
        /// <returns>The remainder value of divide the current object by the specified argument.</returns>
        object Mod(object obj);
    }
}
